package com.j1903.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.util.Calendar;
import java.util.Date;
import java.util.Map;

/**
 * JWT工具类
 */
public class JwtUtil {
    /**
     * 创建token
     * @param id 登录用户id，也可以是任意数据
     * @param time 过期时间
     * @param param 登录用户名，也可以是任意数据
     * @return
     */
    public static String createToken(String id,
                                     Integer time,Map<String,Object> param)
    {
        Calendar nowTime=Calendar.getInstance();
        //5代表过期时间是5分钟后
        nowTime.add(Calendar.MINUTE,time==null?60:time);
        ObjectMapper om=new ObjectMapper();
        String p= "";
        try {
            p = om.writeValueAsString(param);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        //得到一个时间戳格式的过期时间
        Date expiresDate=nowTime.getTime();
        return JWT.create().withAudience(id)//签发者
                //签发日期
                .withIssuedAt(new Date())
                //过期日期
                .withExpiresAt(expiresDate)
                //自定义数据，可以有多个，连续.withClaim
                .withClaim("param", p)
                .withClaim("id", id)
                //指定数字签名的加密算法和密钥
                .sign(Algorithm.HMAC256("j1903"));
    }

    /**
     * 验证token
     * @param token 被验证的token字符串
     * @param key 加密密钥
     */
    public static DecodedJWT verifyToken(String token,
                                         String key){
        try{
            JWTVerifier verifier=
                    JWT.require(Algorithm.HMAC256(key))
                            .build();
            return verifier.verify(token);
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取签发者
     * @param token token字符串
     * @return
     */
    public static String getAudience(String token){
        return JWT.decode(token).getAudience().get(0);
    }

    /**
     * 读取自定义数据
     * @param token token字符串
     * @param key 自定义数据的键名
     * @return
     */
    public static Claim getClaim(String token, String key){
        return JWT.decode(token).getClaim(key);
    }
}
